package chapter_array_and_linkedlist;

import utils.ListNode;

public class LinkedList {

    static ListNode initLinkedList() {
        /* 初始化链表 1 -> 3 -> 2 -> 5 -> 4 */
        // 初始化各个节点
        ListNode n0 = new ListNode(1);
        ListNode n1 = new ListNode(3);
        ListNode n2 = new ListNode(2);
        ListNode n3 = new ListNode(5);
        ListNode n4 = new ListNode(4);
        // 构建节点之间的引用
        n0.next = n1;
        n1.next = n2;
        n2.next = n3;
        n3.next = n4;
        return n0;
    }

    /**
     * 在链表的节点 Q 之后插入节点 P
     * 则只需改变两个节点引用（指针）即可
     *
     * @param Q 节点 Q
     * @param P 节点 P
     */
    static void insert(ListNode Q, ListNode P) {
        P.next = Q.next;
        Q.next = P;
    }

    /**
     * 删除链表的节点 Q 之后的首个节点
     *
     * @param Q Q 节点
     */
    static void remove(ListNode Q) {
        if (Q.next == null) return;
        // Q -> P -> n1
        Q.next = Q.next.next;
    }

    /**
     * 访问链表中索引为 index 的节点
     *
     * @param head  链表节点
     * @param index 索引
     * @return 链表节点
     */
    static ListNode access(ListNode head, int index) {
        for (int i = 0; i < index; i++) {
            if (head == null) {
                return null;
            }
            head = head.next;
        }
        return head;
    }

    /**
     * 在链表中查找值为 target 的首个节点
     *
     * @param head   链表节点
     * @param target 值为 target 的首个节点
     * @return 该节点在链表中的索引
     */
    static int find(ListNode head, int target) {
        int index = 0;
        while (head != null) {
            if (head.val == target)
                return index;
            head = head.next;
            index++;
        }
        return -1;
    }

    public static void main(String[] args) {
        ListNode listNode = initLinkedList();

        insert(listNode, new ListNode(6));
        System.out.println(listNode);
    }
}
